package cliente;

import java.awt.Button;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class ClienteUDP extends Frame implements ActionListener {

	private static final long serialVersionUID = 1L;

	private TextField txtDatos;
	private TextArea txtArea;

    private Button btnEnviar;

    private DatagramPacket paqEnviar, paqRecibir;
    private DatagramSocket socketEnviar, socketRecibir;

    ClienteUDP() {
    	inicializaGUI();        
        try {
            socketEnviar = new DatagramSocket();
            socketRecibir = new DatagramSocket(6501);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        
        addWindowListener(new WindowAdapter() {
    		public void windowClosing(WindowEvent e) {
    			socketEnviar.disconnect();
    			socketEnviar.close();    			  			
    			System.exit(0);
    		}
    	}); 
    }

	public void actionPerformed(ActionEvent e) {
        try {
            byte array[] = txtDatos.getText().getBytes();
            txtArea.append("\nEnviando el paquete al servidor...");
            paqEnviar = new DatagramPacket(array, array.length, InetAddress
                    .getLocalHost(), 6500);
            socketEnviar.send(paqEnviar);
            txtArea.append("\nPaquete enviado");
        } catch (IOException io) {
            io.printStackTrace();
        }
    }

    public static void main(String args[]) {
        ClienteUDP cliente = new ClienteUDP();
        cliente.esperarPaquete();
    }
    
    private void esperarPaquete() {
        while (true) {
            try {
                byte array[] = new byte[100];
                paqRecibir = new DatagramPacket(array, array.length);
                socketRecibir.receive(paqRecibir);
                // ****** Se queda esperando
                muestraDatosRecibidos(array);                
            } catch (IOException io) {
                io.printStackTrace();
            }
        }
    }
    
    private void muestraDatosRecibidos(byte[] array) {
    	txtArea.append("\nUn paquete recibido.");
        txtArea.append("\nLos datos del paquete son:");
        txtArea.append("\ndireccion: " + paqRecibir.getAddress());
        txtArea.append("\nPuerto   : " + paqRecibir.getPort());
        txtArea.append("\nLongitud : " + paqRecibir.getLength());
        txtArea.append("\nEl paquete contiene lo siguiente: \n");
        array = paqRecibir.getData();
        String cadena = new String(array);                
        txtArea.append(cadena);		
	}

	private void inicializaGUI() {
    	setTitle("Cliente UDP");
        Panel panel = new Panel();
        btnEnviar = new Button("Enviar");
        btnEnviar.addActionListener(this);
        txtDatos = new TextField(30);
        txtArea = new TextArea(20, 40);
        txtArea.setEditable(false);
        panel.add(new Label("Datos a enviar:"));
        panel.add(txtDatos);
        panel.add(btnEnviar);
        panel.add(txtArea);
        add(panel);
        pack();
        setVisible(true);		
	}
}
